package com.fdb.smcts.redis.lock;

import java.lang.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 分布式锁注解
 * keyParamNames 和 key互斥并且必须保证有一个不为空
 * @author xiaojunhui
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface RedisLock {

    /**
     * 需要作为分布式锁key的参数名
     *
     * @return
     */
    String[] keyParamNames() default {};

    /**
     * 直接指定分布式锁的key值
     *
     * @return
     */
    String key() default "";

    /**
     * 锁前缀。为了防止某些流水号可能会一致，可以加上锁前缀
     *
     * @return
     */
    String keyPreFarmat() default "";

    /**
     * 锁的过期秒数,默认是30秒
     *
     * @return
     */
    int expire() default 30;

    /**
     * 尝试加锁，最多等待时间
     *
     * @return
     */
    long waitTime() default Long.MIN_VALUE;

    /**
     * 锁的超时时间单位，默认秒
     *
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;
}
